package com.ruoyi.game.core.card;


import com.ruoyi.game.constant.GameErrorCode;
import com.ruoyi.game.core.exception.GameOpException;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

public class BasePokerLogic extends BasePoker{

    /**
     * 唯一 获取乱牌
     * @param normalCount 加几副普通牌
     * @param trumpCount  带几对大小王（每对包含一个小王和一个大王）
     * @param pocketListType 排序方式
     * @return 洗好的唯一乱牌列表
     */
    public static ArrayList<Integer> getOnlyRandomPockerList(int normalCount, int trumpCount, PockerListType pocketListType) {
        int total = MAX_NORMAL_POCKER * normalCount + trumpCount * MAX_TRUMP_POCKER;

        ArrayList<Integer> pocketList = new ArrayList<>(MAX_NORMAL_POCKER);
        if (PockerListType.POCKERLISTTYPE_AFIRST == pocketListType) {
            pocketList.addAll(Arrays.asList(PockerList_AFirst));
        } else if (PockerListType.POCKERLISTTYPE_AEND == pocketListType) {
            pocketList.addAll(Arrays.asList(PockerList_AEnd));
        } else {
            pocketList.addAll(Arrays.asList(PockerList_TWOEnd));
        }

        ArrayList<Integer> list = new ArrayList<>(total);

        // 添加普通牌，加偏移避免重复
        for (int i = 0; i < normalCount; i++) {
            for (Integer cardValue : pocketList) {
//                list.add(cardValue + (BasePoker.LOGIC_MASK_COLOR_MOD * i));
                list.add(cardValue);
            }
        }

        // 添加固定值的大小王（不加偏移）
        for (int i = 0; i < trumpCount; i++) {
            list.add(0x41); // 小王
            list.add(0x42); // 大王
        }

        Collections.shuffle(list);
        return list;
    }

    public static ArrayList<Integer> getFixedPokerList() {
        // 按照你的描述构建牌堆（固定顺序）
        String[] cardDescList = {
                "黑桃5", "梅花8", "梅花4", "黑桃6", "红桃5", "梅花5", "梅花4", "大王", "梅花5",
                "黑桃4", "黑桃3", "梅花3", "梅花3", "方块4", "红桃6", "黑桃Q", "小王", "红桃8", "方块J",
                "方块A", "梅花6", "黑桃7", "梅花2", "红桃9", "黑桃10", "红桃4", "梅花J", "红桃K", "黑桃2",
                "红桃2", "梅花7", "黑桃3", "梅花9", "方块A", "红桃2", "方块K", "梅花2", "小王", "方块7",
                "黑桃Q", "黑桃6", "梅花K", "黑桃9", "黑桃7", "黑桃10", "红桃A", "方块3", "方块9", "方块5",
                "黑桃K", "黑桃J", "大王", "方块6", "红桃7", "方块7", "方块Q", "红桃3", "红桃8", "红桃J",
                "方块6", "方块9", "黑桃J", "黑桃2", "方块3", "梅花10", "方块J", "梅花A", "梅花J", "梅花Q",
                "方块Q", "梅花A", "方块4", "红桃5", "红桃9", "红桃10", "方块10", "方块2", "方块5", "梅花K",
                "梅花7", "红桃Q", "方块8", "红桃A", "梅花10", "黑桃A", "黑桃4", "红桃J", "方块8", "黑桃A",
                "红桃3", "红桃10", "梅花6", "梅花9", "红桃6", "方块K", "方块2", "黑桃K", "红桃7", "黑桃8","黑桃5",
                "黑桃8", "红桃K", "梅花Q", "红桃4", "梅花8", "红桃Q", "黑桃9", "方块10"
        };

//        String[] cardDescList = {
//                "红桃10", "红桃6", "方块3", "方块8", "黑桃J", "方块5", "黑桃5", "红桃4", "梅花4", "黑桃7",
//                "方块7", "黑桃2", "黑桃6", "大王", "梅花10", "方块J", "黑桃7", "红桃8", "方块A", "红桃7",
//                "方块A", "方块K", "黑桃A", "梅花3", "红桃K", "梅花5", "梅花7", "黑桃4", "红桃8", "红桃Q",
//                "黑桃10", "红桃3", "红桃7", "红桃K", "方块4", "梅花A", "黑桃A", "小王", "红桃Q", "黑桃Q",
//                "梅花8", "红桃J", "梅花A", "红桃10", "黑桃8", "梅花2", "梅花10", "红桃3", "梅花9", "黑桃3",
//                "黑桃2", "黑桃10", "黑桃9", "方块Q", "黑桃3", "梅花2", "黑桃J", "梅花9", "红桃A", "红桃4",
//                "小王", "梅花3", "红桃5", "红桃2", "方块3", "梅花6", "红桃9", "方块2", "梅花Q", "黑桃9",
//                "梅花Q", "方块Q", "方块5", "梅花K", "方块9", "方块10", "梅花7", "方块J", "方块K", "方块8",
//                "黑桃Q", "黑桃6", "大王", "黑桃5", "方块4", "黑桃4", "方块10", "方块6", "红桃6", "梅花J",
//                "红桃2", "梅花4", "红桃J", "方块6", "红桃9", "梅花J", "梅花5", "梅花8", "方块7", "黑桃K",
//                "红桃5", "梅花K", "红桃A", "方块2", "梅花6", "黑桃K", "黑桃8", "方块9"
//        };

//        String[] cardDescList = {
//                // 玩家0     玩家1     玩家2     玩家3     玩家4
//                "黑桃5",  "梅花8",  "梅花4",  "黑桃7",  "黑桃2",
//                "黑桃Q",  "梅花4",  "红桃5",  "方块4",  "红桃2",
//                "黑桃3",  "黑桃6",  "梅花3",  "方块J",  "红桃2",
//                "黑桃3",  "黑桃8",  "红桃8",  "方块A",  "方块2",
//                "梅花6",  "黑桃7",  "方块K",  "方块7",  "红桃9",
//                "红桃4",  "梅花J",  "红桃K",  "方块A",  "黑桃2",
//                "梅花7",  "黑桃Q",  "梅花9",  "梅花5",  "大王",
//                "方块K",  "红桃J",  "黑桃10", "梅花5",  "大王",
//                "黑桃6",  "梅花K",  "黑桃9",  "黑桃10", "小王",
//                "黑桃5",  "方块3",  "方块9",  "黑桃K",  "小王",
//                "黑桃J",  "梅花9",  "方块6",  "黑桃8",  "方块2",
//                "方块Q",  "红桃3",  "红桃8",  "方块5",  "梅花2",
//                "方块9",  "黑桃J",  "梅花J",  "梅花10", "梅花2",
//                "方块J",  "梅花A",  "梅花3",  "方块Q",  "梅花Q",
//                "黑桃4",  "方块4",  "红桃5",  "红桃10", "红桃9",
//                "方块10", "红桃3",  "黑桃A",  "梅花7",  "梅花K",
//                "红桃Q",  "方块8",  "黑桃A",  "红桃6",  "梅花10",
//                "黑桃4",  "红桃J",  "方块8",  "红桃7",  "方块5",
//                "红桃10", "梅花6",  "红桃A",  "方块3",  "方块6",
//                "红桃6",  "黑桃K",  "红桃7",  "方块7",  "梅花A",
//                "红桃A",  "红桃K",  "梅花Q",  "梅花8",  "红桃4",  "红桃Q", "黑桃9", "方块10"     // 底牌
//        };
        // {"type":"START_SET","data":{"setId":1,"dealerPos":0,"handCardsMap":{"0":[25,29,24,3,142,82,86,122,84,5,54,66,46,8,57,89,105,11,119,114],"1":[23,100,59,20,145,55,4,35,121,126,93,19,10,92,91,140,27,45,109,94],"2":[52,137,138,58,22,13,30,139,21,99,36,53,7,28,44,42,115,103,120,38],"3":[85,56,124,132,9,117,123,134,102,61,107,133,118,40,18,136,39,88,98,108],"4":[14,50,12,41,101,116,135,51,125,104,131,87,37,83,2,43,60,141,130,6]},"kouPaiList":[146,34,26,90,62,106,65,110]}}

        ArrayList<Integer> fixedDeck = new ArrayList<>();
        for (String desc : cardDescList) {
            Integer card = BasePoker.parseCard(desc);
            if (card == null) {
                throw new GameOpException(GameErrorCode.INVALID_CARD, "无法识别牌面: " + desc);
            }
            fixedDeck.add(card);
        }
        return fixedDeck;
    }

    /**
     * 从原始牌堆中精确移除目标牌（支持重复牌，逐张移除）
     *
     * @param source 原始牌堆（例如手牌）
     * @param targets 要移除的牌列表
     * @return 是否移除成功（true 表示所有牌都成功移除，false 表示存在不在 source 中的牌）
     */
    public static boolean removeExactCards(List<Integer> source, List<Integer> targets) {
        List<Integer> copy = new ArrayList<>(source);
        for (Integer card : targets) {
            if (!copy.remove(card)) {
                return false;
            }
        }

        // 所有都成功移除后再修改原始列表
        source.clear();
        source.addAll(copy);
        return true;
    }
}